//
// Created by LONG on 2020/10/21.
//

#ifndef CSP_INCLUDE_UTILS_MEMPOOLSET_H_
#define CSP_INCLUDE_UTILS_MEMPOOLSET_H_

#include <stdint.h>
#include "commDef.h"
#include "memPool.h"

#ifdef __cplusplus
extern "C"
{
#endif

/******************************************************************************
 mem pool : 采用无锁方式实现的内存池。
 可用于SPSC(单生产者--单消费者)、MPSC(多生产者--单消费者)、
 SPMC(单生产者--多消费者)、MPMC(多生产者--多消费者)场景。
 ******************************************************************************/

#define MP_SIZE(s)    (s)
#define MP_COUNT(cnt) (cnt)

enum
{
    MP_MODE_NORMAL, /* 内存块大小为普通升序 */
    MP_MODE_MULT,   /* 内存块大小为倍数提升 */
    MP_MODE_POWER2, /* 内存块大小为2的指数提升 */
    MP_MODE_MAX
};

typedef struct MemPoolAttr
{
    uint32_t size; /* 块大小 */
    uint32_t count; /* 块数 */
} S_MemPoolAttr;

typedef struct MemPoolSetAttr
{
    uint32_t memPoolType;
    uint32_t memPoolMode;
    uint32_t memPoolAttrNum;
    S_MemPoolAttr *pMemPoolAttrs;
} S_MemPoolSetAttr;

int32_t MPS_Init(S_MemPoolSetAttr memPoolSetAttrArray[], uint32_t arrayNum);
void MPS_Final();
void* MPS_Get(uint32_t arrayIdx, uint32_t size, const char* func, uint32_t line);
int32_t MPS_Put(void *chunk);
void MPS_Dump(void *buffer, uint32_t size);
void MPS_ResetCounter();
uint32_t MPS_GetCount();
uint32_t MPS_PutCount();

#ifdef __cplusplus
}
#endif

#endif //CSP_INCLUDE_UTILS_MEMPOOLSET_H_
